package com.pxl.service.impl;

import com.pxl.dao.CourseDao;
import com.pxl.dao.UserDao;
import com.pxl.entity.*;
import com.pxl.service.CourseService;
import com.sun.mail.util.LineInputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class CourseServiceImpl implements CourseService {

    /**
     *  一定要自动装配,因为我们用到的是 new 出来的对象
     */
    @Autowired
    private CourseDao courseDao;

    @Autowired
    private UserDao userDao;

    @Override
    public List<Course> queryStuCourse(int stuId) {
        System.out.println(stuId);
        List<Integer> courseId =  courseDao.queryCourseIdByStuId(stuId);
        List<Course> courseList = new ArrayList<>();

        for(int i : courseId) {
            // 根据课程号查询课程信息
          Course course = courseDao.queryCourseInfoById(i);
            // 通过老师 id 查询 老师姓名
          course.setTeaName(courseDao.selectTeaNameByTeaId(course.getTeaId()));

            // 选课表
            Course_choose course_choose = new Course_choose();
            course_choose.setClassId(i);
            // 规范命名要求
            course_choose.setStuId(stuId);

            // 根据老师的 id 和 学生的 id 得到唯一的一个成绩
//            int score = courseDao.selectScore(course_choose);

            System.out.println("..............................................................");
//
            System.out.println(courseDao.selectScore(course_choose));

            course.setScore(courseDao.selectScore(course_choose));

            courseList.add(course);
        }

        return courseList;
    }

    /**
     *  查询所有课程
     * @return
     */
    @Override
    public List<Course> queryAllCourse(int stuId) {

        // 查询所有课程
        List<Course> course_list = courseDao.queryAllCourse();

        List<Integer> stu_courseList = courseDao.queryCourseIdByStuId(stuId);

        for(Course course :course_list) {
            course.setClassLimitInsName(new ArrayList<>());
            // 通过课程 id 查询到所有的学院 id
            List<Integer> limit_list = courseDao.selectInsIdByClassId(course.getClassId());

            for(Integer i : limit_list) {
               course.getClassLimitInsName().add( courseDao.selectInsNameByInsId(i));
            }

            // 设置课程的教师名称
            course.setTeaName(courseDao.selectTeaNameByTeaId(course.getTeaId()));


            // 课程是否被选择
            course.setIsChoose(0);

            for(int is :stu_courseList) {
                if(course.getClassId() == is) {
                    course.setIsChoose(1);
                    break;
                }
            }
        }



        return course_list;
    }

    /**
     *  根据老师的 id 进行筛选课程,展示到前台
     * @param teaId
     * @return
     */
    @Override
    public List<Course> queryAllById(int teaId) {
        List<Course> course_list = courseDao.queryAllById(teaId);
        for(Course course :course_list) {
            course.setTeaName(courseDao.selectTeaNameByTeaId(course.getTeaId()));

            course.setClassLimitInsName(new ArrayList<>());

            // 通过课程号查询到学院号
            List<Integer> limit_list = courseDao.queryInsByClassId(course.getClassId());

            for(Integer i :limit_list) {
                // 向课程中添加学院的限制信息
                course.getClassLimitInsName().add(courseDao.selectNameByInsId(i));
            }

        }
        return course_list;
    }

    /**
     *  根据学院 id 号查询到所有的课程信息
     * @param insId
     * @return
     */
    @Override
    public List<Course> queryAllByInsId(int insId) {
        // 查询所有的课程
        List<Course> course_list = courseDao.queryAllCourse();

        List<Course> course_InsList = new ArrayList<>();

        // 遍历所有的课程找到 学院是 insId 的课程
        for(Course c :course_list) {
            // 通过遍历课程号指定学院号
            List<Integer> limit_list = courseDao.selectInsIdByClassId(c.getClassId());

            for(Integer i : limit_list){
                // 课程一般都是某个学院开设的
                if(i == insId) {
                    course_InsList.add(c);
                    break;
                }
            }
        }

        for(Course course : course_InsList) {
            course.setClassLimitInsName(new ArrayList<>());

            course.setTeaName(courseDao.selectTeaNameByTeaId(course.getTeaId()));
            // 通过课程 id 找到 对应的 学院 id,进而通过 学院 id 找到学院名称
            List<Integer> limit_list = courseDao.selectInsIdByClassId(course.getClassId());

            for(Integer i :limit_list) {
                course.getClassLimitInsName().add(courseDao.selectNameByInsId(i));
            }
        }
        return course_InsList;
    }


    /**
     *  查询课程详情
     * @param classId
     * @return
     */
    @Override
    public Course queryCourseDetail(int classId) {
        Course course=courseDao.selectClassByClassId(classId);
        List<Integer> limit_list=courseDao.selectInsIdByClassId(classId);
        course.setClassLimitInsName(new ArrayList<>());
        for(Integer i:limit_list){
            course.getClassLimitInsName().add(courseDao.selectNameByInsId(i));
        }
        course.setTeaName(courseDao.selectTeaNameByTeaId(course.getTeaId()));
        return course;
    }

    /**
     *  根据课程号搜寻课程
     * @param classId
     * @return
     */
    public List<Course> queryCourseByClassId(int classId) {
        List<Course> course_list = new ArrayList<>();

        Course course = courseDao.selectClassByClassId(classId);

        course.setTeaName(courseDao.selectTeaNameByTeaId(course.getTeaId()));
        course.setClassLimitInsName(new ArrayList<>());

        List<Integer> limit_list = courseDao.selectInsIdByClassId(classId);

        for(Integer i : limit_list) {
            course.getClassLimitInsName().add(courseDao.selectNameByInsId(i));
        }

        course_list.add(course);

        return course_list;
    }

    public boolean checkStuIns(int classId,int stuId) {
        List<Integer> insIds = courseDao.queryInsByClassId(classId);
        int stu_insId = userDao.selectStuById(stuId).getInsId();
        for(int ins :insIds) {
            if(ins == stu_insId) {
                return true;
            }
        }
        return false;
    }

    /**
     *  退课
     * @param stuId
     * @param classId
     */
    @Override
    public void deleteCourseChoose(int stuId,int classId) {
        courseDao.downChooseNum(classId);

        Course_choose course_choose = new Course_choose();
        course_choose.setClassId(classId);
        course_choose.setStuId(stuId);

        courseDao.deleteCourseChoose(course_choose);
    }

    /**
     *  选课
     * @param classId
     * @param stuId
     */
    public void chooseCourse(int classId,int stuId) {
        courseDao.addCourseChooseNum(classId);

        Course_choose course_choose = new Course_choose();
        course_choose.setStuId(stuId);
        course_choose.setClassId(classId);
        course_choose.setScore(0);

        courseDao.addCourseChoose(course_choose);
        return;
    }


    /**
     *  查询所有的学院,便于老师在增加课程时设置课程的学院
     * @return
     */
    public List<Institution> queryAllIns(){
        return courseDao.queryAllIns();
    }

    /**
     *  插入课程
     * @param name
     * @param num
     * @param teaId
     * @return
     */
    @Override
    public int insertCourse(String name,String num,int teaId){
        Course course = new Course();

        course.setClassName(name);
        course.setClassNum(Integer.parseInt(num));
        course.setTeaId(teaId);
        course.setClassChooseNum(0);

        courseDao.insertCourse(course);

        System.out.println(course.getClassId());
        return course.getClassId();
    }

    @Override
    public void insertInsLimit(String det,int classId) {
        String[] insList=det.split(",");
        for(String in:insList){
            Course_limit course_limit=new Course_limit();
            course_limit.setClassId(classId);
            System.out.println(in);
            course_limit.setInsId(Integer.parseInt(in));
            courseDao.insertInsLimit(course_limit);
        }
    }

    public Course queryCourseInfoById(int classId) {
        Course course = courseDao.queryCourseInfoById(classId);
        return course;
    }

    public List<Integer> selectCourseLimit(int classId) {
        List<Integer> integers = courseDao.selectInsIdByClassId(classId);
        return integers;
    }

    @Override
    public int updateCourse(String name, String num, int teaId,int classId) {
        Course course = new Course();
        course.setClassName(name);
        course.setClassNum(Integer.parseInt(num));
        course.setTeaId(teaId);
        course.setClassChooseNum(0);
        course.setClassId(classId);
        courseDao.updateCourse(course);

        return course.getClassId();
    }

    @Override
    public void updateInsLimit(String det, int classId) {
        String[] insList = det.split(",");
        // 先将原来的删除掉
        courseDao.deleteInsLimit(classId);

        for (String ins : insList) {

            Course_limit course_limit = new Course_limit();

            course_limit.setClassId(classId);
            course_limit.setInsId(Integer.parseInt(ins));

            // 为课程添加学院的限制
            courseDao.insertInsLimit(course_limit);
        }
    }

    /**
     *  删除课程
     * @param classId
     */
    // 疑问: 删除的时候为什么先删除关联,而是先删除主要的？
    public void deleteCourse(int classId) {
        courseDao.deleteCourseById(classId);

        // 解除选课表关联
        courseDao.deleteStuByClassId(classId);

        // 解除学院表关联
        courseDao.deleteLimitByClassId(classId);

        return;
    }

    @Override
    public List<Student> queryStuByCourseId(int classId) {

        List<Student> students = new ArrayList<>();

        /**
         *   通过选课表,根据课程号找到所有的学生号
         */
        List<Course_choose> courseChooses = courseDao.queryStuIdByCourseId(classId);

        for (Course_choose course_choose : courseChooses) {

            System.out.println(course_choose.getStuId());
            // 通过学号找到每个学生的详细信息
            Student  student = courseDao.queryStuById(course_choose.getStuId());

            // 设置评分
            student.setTemScore(course_choose.getScore());

            students.add(student);
        }

        return students;

    }

    /**
     *  更新评分
     * @param classId
     * @param stuId
     * @param score
     */
    public void updateScore(int classId,int stuId,int score) {
        Course_choose course_choose = new Course_choose();
        course_choose.setClassId(classId);
        course_choose.setStuId(stuId);
        course_choose.setScore(score);

        courseDao.updateScore(course_choose);
    }

    /**
     *  删除选这门课的学生
     * @param classId
     * @param stuId
     */
    @Override
    public void deleteStuCourse(int classId, int stuId) {
        // 数据库对应的选人的数量对应的要 - 1(考虑应该全面一点)
        courseDao.downChooseNum(classId);

        Course_choose course_choose = new Course_choose();
        course_choose.setStuId(stuId);
        course_choose.setClassId(classId);

        courseDao.deleteStuCourse(course_choose);
    }


}
